// 文件流的应用
// Created by FanGccU on 2025/6/14.
//

#include <iostream>
#include <fstream>
using namespace std;

/**
 * 文件地址
 */
const string FILE_ = "C:\\Users\\FanGccU\\Documents\\test\\userInfo.txt";

/**
 * 文件读取和写入
 */
void fileStreamFunc() {
    char data[100];

    // 以写方式打开文件
    ofstream outfile;

    /**
    * 文件路径，如果文件不存在则创建
    * opem(参数1,参数2)
    * 参数1:文件地址.
    * 参数2:打开文件的方式
    *       ios:app 追加写入,写入的数据追加在文件末尾
    *       ios:ate 打开文件并且文件光标指向文件末尾
    *       ios:in 以读取的方式打开文件           (ifstream函数默认)
    *       ios:out 以写入的方式打开文件          (ofstream函数默认)
    *       ios:trunc 如果文件已经存在则清空文件
    */
    outfile.open(FILE_);

    cout << "写入文件" << endl;
    cout << "输入你的名称：" << endl;

    // 读取用户输入的一行文本并存储到data数组中
    cin.getline(data, 100);

    // 向文件写入用户输入的信息并且换行
    outfile << data << endl;

    cout << "输入你的年龄：" << endl;
    cin >> data;

    // 再次向文件写入用户输入的信息(outfile追加)
    outfile << data << endl;
    // 关闭输出流确保数据写入文件
    outfile.close();

    // 以读的方式打开文件
    ifstream infile;
    infile.open(FILE_);

    cout << "读取文件：" << endl;
    // 从文件中读取第一个字符串（遇到空格或换行则停止）
    // infile >> data;
    // 因为 cin >> 读取到空格会停止,如果名称存在空格会导致输出的内容错误,所以这里使用 getline 只有读取带换行符才结束
    infile.getline(data, 100);

    // 向控制台打印数据
    cout << data << endl;

    // 再次从文件中读取数据并打印(读取第二行的数据)
    infile >> data;
    cout << data << endl;

    // 关闭读取流
    infile.close();
}

/**
 * ignore的应用
 */
void ignoreFunc() {
    int age;
    char name[100];
    string address;

    cout << "输入年龄：" << endl;
    cin >> age;

    /**
    *  使用 cin >> 进行数据输入会留下一个 '\n'
    * 而 cin.getline 读取到 '\n' 会停止
    * cin.ignore() 清除输入流缓存，否则cin.getline()会读取换行符，直接导致结束
    * 特别是在 cin >> 和 cin.getline() 混合使用时
     */
    cin.ignore();

    cout << "输入名称：" << endl;
    cin.getline(name, 100);

    cout << "输入地址：" << endl;
    getline(cin, address);

    cout << "age: " << age << "\tname: " << name << "\t地址信息：" << address << endl;

    /**
     * cin >> 和 cin.getline() 有什么区别？
     * cin >> :
     * 1、不能读取空格和换行，读取到空格和换行会直接停止
     * 2、输入完数据后换行符会留着缓存中，需要cin.ignore()清除
     * 适用于读取单个单词
     * cin.getline() :
     * 1、不能读取换行符，读取到换行符会直接停止
     * 2、输入完输入后不会产生换行符
     * 适用于读取整行文本
     */
}

/**
 * 以追加的方式写入文件
 */
void fileAppFunc() {
    char data[100];

    ofstream outfile;
    outfile.open(FILE_, ios::app);

    cout << "追加数据:" << endl;
    cin.getline(data, 100);

    outfile << data;
    outfile.close();

    ifstream infile;
    infile.open(FILE_);

    string str;
    while (getline(infile, str)) {
        cout << str << endl;
    }
}

int main(int argc, char *argv[]) {
    // fileStreamFunc();
    // ignoreFunc();
    fileAppFunc();
}
